package com.wwlwxg.algorithm.calculator;

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

/**
 * 逆波兰计算器
 * 计算后缀表达式的值
 * 1. 输入一个逆波兰表达式(后缀表达式)，使用栈(Stack), 计算其结果
 * 2. 支持小括号和多位数整数，因为这里我们主要讲的是数据结构，因此计算器进行简化，只支持对整数的计算。
 */
public class PolanNotation {

	public static void main(String[] args) {
		String expression = "63 3 6 + 1 2 + 3 2 + + * * ";
		List<String> list = getList(expression);
		int calculate = calculate(list);
		System.out.println(calculate);
	}

	//获取每一个元放到集合
	private static List<String> getList(String expression) {
		String[] split = expression.split(" ");
		List<String> list = new ArrayList<>();
		for (String ele:split){
			list.add(ele);
		}
		return  list;
	}

	/**
	 * 计算后缀表达式
	 * @param list
	 * @return
	 */
	private static int calculate(List<String> list) {
		Stack<String> stack = new Stack<String>();
		int res = 0;
		for (String ele:list){
			if (ele.matches("\\d+")){
				//如果是数字直接push
				stack.push(ele);
			}else{
				//反之进行计算
				int num2 = Integer.parseInt(stack.pop());
				int num1 = Integer.parseInt(stack.pop());
				if (ele.equals("-")){
					res = num1-num2;
				}else if (ele.equals("+")){
					res = num1+num2;
				}else if (ele.equals("*")){
					res = num1*num2;
				}else if (ele.equals("/")){
					res = num1/num2;
				}
				stack.push(String.valueOf(res));
			}
		}
		return Integer.parseInt(stack.pop());
	}
}
